package com.example.flowabledemo.service;

import com.example.flowabledemo.data.dto.ResponsePageResult;
import com.example.flowabledemo.data.dto.ResponseResult;
import com.example.flowabledemo.data.entity.AaApproval;
import com.example.flowabledemo.data.entity.AaProcess;
import com.example.flowabledemo.data.vo.ApplyLeaveVo;
import com.example.flowabledemo.data.vo.ApprovalLeaveVo;
import com.example.flowabledemo.data.vo.HistoryProcessVo;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.engine.task.Comment;
import org.flowable.task.api.Task;

/**
 * @author linke
 * @date 2020/11/27 20:09
 * @description
 */
public interface FlowableService {

  /**
   * 开始一个流程
   *
   * @param processKey  流程主键，不能为空。
   * @param businessKey 标识流程实例并可用于稍后通过查询API检索流程实例的键
   * @param map         要传递的变量可以为null
   * @return
   */
  ProcessInstance start(String processKey, String businessKey, Map<String, Object> map);

  /**
   * 完成任务
   */
  void complete(String taskId, Map<String, Object> map);

  /**
   * 根据实例id获取流程最新的Task
   *
   * @param processInstanceId
   * @return
   */
  Task getNewestTask(String processInstanceId);

  /**
   * 更新流程状态
   *
   * @param processInstanceId
   * @param processStatus
   */
  void updateProcessStatus(String processInstanceId, String processStatus);

  /**
   * 获取最后一条历史数据
   *
   * @param processInstanceId
   * @return
   */
  HistoricActivityInstance getLastHistoryData(String processInstanceId);

  /**
   * 获取流程图片
   *
   * @param processInstanceId
   * @param response
   * @throws Exception
   */
  void createProcessImage(String processInstanceId, HttpServletResponse response) throws Exception;

  /**
   * 获取流程列表
   *
   * @param page
   * @param limit
   * @return
   */
  ResponsePageResult getProcess(String status,Integer page, Integer limit);

  /**
   * 获取流程，根据实例
   * @param processInstanceId
   * @return
   */
  AaProcess getProcess(String processInstanceId);

  /**
   * 获取历史流程，根据流程实例id
   * @param processInstanceId
   * @return
   */
  List<HistoryProcessVo> getHistory(String processInstanceId);

  /**
   * 某个任务添加注释
   * @param taskId 任务id
   * @param processInstanceId 任务对应的实例id
   * @param message 要注释的消息
   * @return
   */
  Comment addCommand(String taskId,String processInstanceId,String message);

  /**
   * 获取审批流程列表
   *
   * @param page
   * @param limit
   * @return
   */
  ResponsePageResult getApproval(String status,Integer page, Integer limit);

  /**
   * 获取审批历史
   * @param status
   * @param page
   * @param limit
   * @return
   */
  ResponsePageResult getApprovalHistory(String status,Integer page, Integer limit);

  /**
   * 获取请假流程的审批信息
   * @param processInstanceId
   * @return
   */
  ApprovalLeaveVo getApprovalLeaveVo(String processInstanceId);


  /**
   * 获取流程
   * @param processInstanceId
   * @return
   */
  AaProcess getAaProcess(String processInstanceId);

  /**
   * 获取请假vo
   * @param processInstanceId
   * @return
   */
  ApplyLeaveVo getApplyLeaveVo(String processInstanceId);

  /**
   * 获取flowable中的 map（Variables）
   * @param processInstanceId
   * @return
   */
  Map<String,String> getMap(String processInstanceId);

  void updateMap(String processInstanceId,Map<String,Object> map);

  /**
   * 添加审批记录，全局唯一调用入口
   */
  void addApproval(AaApproval aaApproval);

  void addProcess(AaProcess aaProcess);

  /**
   * 获取运行中的流程的数据量
   */
  int getRunProcessNumber(String username,String processType);

  /**
   * 撤销(删除)某个流程
   * @param username
   * @param processInstanceId
   * @param reason 删除原因
   * @return
   */
  ResponseResult cancelProcess(String username,String processInstanceId,String reason);
}
